package com.sumset.daos;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.jboss.seam.annotations.TransactionPropagationType;
import org.jboss.seam.annotations.Transactional;

/**
 * Descripcion Clase: Clase para crear todas las funcionalidades propias del taringa.
 * Responsabilidades: Proveer a los beans de session de las operaciones basicas de cada
 * una de las entidades como insertar,actualizar,buscar,etc.
 * Fecha Creacion: 05/02/2012
 * @param <T>: Representa a cualquiera de la entidades que pueden realizar las acciones
 * que provee esta clase.
 * @author andres
 */
public abstract class DaoGenerico<T> {

	@PersistenceContext(unitName = "Taringaso")
	private EntityManager em;

	/**
	 * Constructor generico de la clase DaoGenerico.
	 */
	public DaoGenerico() {
		super();

	}

	/**
	 * Proposito del Metodo: Insertar las entidades en la BD.
	 * Responsabilidades: Es responsable de recibir la entidad que posteriormente
	 * se registrara en la BD.
	 * @return No retorna
	 * @author andres.
	 * @param T: Recibe la entidad, que se persistira.
	 * @exception Exception.*/
	public void insertar(T entidad) {

		try {
			
			em.persist(entidad);// metodo utilizado para insertar
			
		} catch (Exception e) {
			
			
			
		}

	}

	/**
	 * Proposito del Metodo: Actualizar alguna entidad que se requiera.
	 * Responsabilidades: Es responsable de recibir la entidad que posteriormente
	 * sera actualizada en la BD.
	 * @return No retorna
	 * @author andres.
	 * @param T: Recibe la entidad, que se actualizara.
	 * @exception Exception.*/
	public void actualizar(T entidad) {

		try {
			
			em.merge(entidad);// Metodo utilizado para actualizar
			
		} catch (Exception e) {
			
		}
	}

	/**
	 * Proposito del Metodo: Eliminar alguna entidad que se requiera.
	 * Responsabilidades: Es responsable de recibir la entidad que posteriormente
	 * se le eliminaran datos de la BD.
	 * @return No retorna
	 * @author andres.
	 * @param T: Recibe la entidad, que se le eliminaran Datos..
	 * @exception Exception.*/
	public void eliminar(T entidad) {

		try {
			
			em.remove(em.merge(entidad));
			
		} catch (Exception e) {
		
			
		}
	}

	/**
	 * Proposito del Metodo: Realizar la busqueda de alguna entidad.
	 * Responsabilidades: Es responsable de recibir la llave primaria de algun datos
	 * de una entidad y realizar la busqueda del o de la misma.
	 * @return T: El Datos completos de la entidad.
	 * @author andres.
	 * @param id: El id de la entidad a Buscar.
	 * @exception Exception.*/
	@Transactional(TransactionPropagationType.NEVER)
	public T buscar(Object id){

		T entidad = null;
		
		try {
			
			entidad = em.find(getEntidadClass(), id);
			
		} catch (Exception e) {
			
			

		}
		
		return entidad;

	}

	
	//-------------------------Getters and Setters--------------------------
	
	public abstract Class<T> getEntidadClass();

	public EntityManager getEm() {
		return em;
	}

	public void setEm(EntityManager em) {
		this.em = em;
	}

}
